// Wails运行时绑定(在Wails环境中会自动注入)
// 开发时可以mock这些函数

let state = {
    serverRunning: false,
    files: [],
    logs: [],
    password: '',
    port: 8888 // 保存当前端口
};

// 初始化
window.onload = async function() {
    generatePassword();
    await loadFiles(); // 从后端加载文件列表
    updateUI();

    // 自动启动服务
    await autoStartService();
};

// 自动启动服务
async function autoStartService() {
    try {
        const port = parseInt(document.getElementById('portInput').value);
        const password = document.getElementById('passwordInput').value;

        if (!password || password.length !== 6) {
            console.log('密码未生成,跳过自动启动');
            return;
        }

        // 调用Go后端函数启动服务
        if (window.go && window.go.main.App) {
            await window.go.main.App.StartServer(port, password);
            state.serverRunning = true;
            updateUI();
            addLog('服务自动启动成功', 'success');
        }
    } catch (error) {
        console.error('自动启动服务失败:', error);
        // 不显示错误提示,静默失败
    }
}

// 启动服务
async function startService() {
    try {
        const port = parseInt(document.getElementById('portInput').value);
        const password = document.getElementById('passwordInput').value;

        if (!password || password.length !== 6) {
            alert('请先生成或输入6位数字密码');
            return;
        }

        // 调用Go后端函数
        if (window.go && window.go.main.App) {
            await window.go.main.App.StartServer(port, password);
        } else {
            // 开发模式mock
            console.log('启动服务', port, password);
        }

        state.serverRunning = true;
        updateUI();
        addLog('服务启动成功', 'success');
    } catch (error) {
        alert('启动服务失败: ' + error);
    }
}

// 停止服务
async function stopService() {
    try {
        // 调用Go后端函数
        if (window.go && window.go.main.App) {
            await window.go.main.App.StopServer();
        } else {
            console.log('停止服务');
        }

        state.serverRunning = false;
        updateUI();
        addLog('服务已停止', 'info');
    } catch (error) {
        alert('停止服务失败: ' + error);
    }
}

// 生成密码
function generatePassword() {
    // 检查服务是否正在运行
    if (state.serverRunning) {
        showPasswordError('启动服务后禁止修改密码');
        return;
    }

    // 隐藏错误提示
    hidePasswordError();

    const password = Math.floor(100000 + Math.random() * 900000).toString();
    document.getElementById('passwordInput').value = password;
    state.password = password;
}

// 显示密码错误提示
function showPasswordError(message) {
    const errorDiv = document.getElementById('passwordError');
    errorDiv.textContent = message;
    errorDiv.style.display = 'block';

    // 3秒后自动隐藏
    setTimeout(() => {
        hidePasswordError();
    }, 3000);
}

// 隐藏密码错误提示
function hidePasswordError() {
    const errorDiv = document.getElementById('passwordError');
    errorDiv.style.display = 'none';
}

// 处理端口修改
function handlePortChange() {
    const portInput = document.getElementById('portInput');
    const newPort = parseInt(portInput.value);

    // 检查服务是否正在运行
    if (state.serverRunning) {
        // 恢复原来的端口值
        portInput.value = state.port;
        showPortError('启动服务后禁止修改端口');
        return;
    }

    // 更新state中的端口
    state.port = newPort;

    // 隐藏错误提示
    hidePortError();
}

// 显示端口错误提示
function showPortError(message) {
    const errorDiv = document.getElementById('portError');
    errorDiv.textContent = message;
    errorDiv.style.display = 'block';

    // 3秒后自动隐藏
    setTimeout(() => {
        hidePortError();
    }, 3000);
}

// 隐藏端口错误提示
function hidePortError() {
    const errorDiv = document.getElementById('portError');
    errorDiv.style.display = 'none';
}

// 复制密码
function copyPassword() {
    const password = document.getElementById('passwordInput').value;
    navigator.clipboard.writeText(password).then(() => {
        alert('密码已复制到剪贴板');
    });
}

// 复制URL
function copyURL() {
    const urls = document.getElementById('accessUrls').textContent;
    if (urls && urls !== '-') {
        navigator.clipboard.writeText(urls.split('\n')[0]).then(() => {
            alert('访问地址已复制到剪贴板');
        });
    }
}

// 从后端加载文件列表
async function loadFiles() {
    try {
        if (window.go && window.go.main.App) {
            const files = await window.go.main.App.GetFiles();
            state.files = files || [];
        } else {
            // 开发模式,保持state.files不变
        }
        updateFileList();
    } catch (error) {
        console.error('加载文件列表失败', error);
    }
}

// 添加文件和文件夹(统一入口)
async function addPaths() {
    // 询问用户要添加文件还是文件夹
    const choice = confirm('点击"确定"添加文件，点击"取消"添加文件夹');

    if (choice) {
        // 用户选择添加文件
        await addFiles();
    } else {
        // 用户选择添加文件夹
        await addFolder();
    }
}

// 添加文件(保留兼容性)
async function addFiles() {
    try {
        if (window.go && window.go.main.App) {
            await window.go.main.App.AddFiles();
            await loadFiles(); // 重新加载文件列表
        } else {
            console.log('添加文件');
            state.files.push({
                id: Date.now().toString(),
                name: 'test.txt',
                size: 1024,
                type: 'file'
            });
            updateFileList();
        }
    } catch (error) {
        alert('添加文件失败: ' + error);
    }
}

// 添加文件夹(保留兼容性)
async function addFolder() {
    try {
        if (window.go && window.go.main.App) {
            await window.go.main.App.AddFolder();
            await loadFiles(); // 重新加载文件列表
        } else {
            console.log('添加文件夹');
            state.files.push({
                id: Date.now().toString(),
                name: 'Documents',
                size: 1024000,
                type: 'directory'
            });
            updateFileList();
        }
    } catch (error) {
        alert('添加文件夹失败: ' + error);
    }
}

// 清空文件
async function clearFiles() {
    if (confirm('确定要清空所有共享文件吗?')) {
        try {
            const fileCount = state.files.length;
            if (window.go && window.go.main.App) {
                await window.go.main.App.ClearFiles();
                await loadFiles(); // 重新加载文件列表
                addLog(`已清空所有共享文件 (${fileCount}个)`, 'error');
            } else {
                console.log('清空文件');
                state.files = [];
                updateFileList();
                addLog(`已清空所有共享文件 (${fileCount}个)`, 'error');
            }
        } catch (error) {
            alert('清空文件失败: ' + error);
        }
    }
}

// 移除单个文件
async function removeFile(fileId) {
    try {
        // 先找到要删除的文件信息
        const fileToRemove = state.files.find(f => f.id === fileId);
        const fileName = fileToRemove ? fileToRemove.name : '未知文件';

        if (window.go && window.go.main.App) {
            await window.go.main.App.RemoveFile(fileId);
            await loadFiles(); // 重新加载文件列表
            addLog(`已删除: ${fileName}`, 'error');
        } else {
            console.log('移除文件', fileId);
            state.files = state.files.filter(f => f.id !== fileId);
            updateFileList();
            addLog(`已删除: ${fileName}`, 'error');
        }
    } catch (error) {
        alert('移除文件失败: ' + error);
    }
}

// 切换标签页
function switchTab(tab) {
    const tabs = document.querySelectorAll('.tab');
    tabs.forEach(t => t.classList.remove('active'));

    if (tab === 'log') {
        document.getElementById('logContent').style.display = 'block';
        document.getElementById('progressContent').style.display = 'none';
        tabs[0].classList.add('active');
    } else {
        document.getElementById('logContent').style.display = 'none';
        document.getElementById('progressContent').style.display = 'block';
        tabs[1].classList.add('active');
    }
}

// 更新UI
function updateUI() {
    const statusText = document.getElementById('statusText');
    const statusDot = document.getElementById('statusDot');
    const startBtn = document.getElementById('startBtn');
    const stopBtn = document.getElementById('stopBtn');

    if (state.serverRunning) {
        statusText.textContent = '服务运行中';
        statusDot.className = 'dot running';
        startBtn.disabled = true;
        stopBtn.disabled = false;

        // 更新访问地址
        updateAccessURLs();
    } else {
        statusText.textContent = '服务已停止';
        statusDot.className = 'dot stopped';
        startBtn.disabled = false;
        stopBtn.disabled = true;
        document.getElementById('accessUrls').textContent = '-';
    }
}

// 更新访问地址
async function updateAccessURLs() {
    try {
        if (window.go && window.go.main.App) {
            const urls = await window.go.main.App.GetAccessURLs();
            document.getElementById('accessUrls').textContent = urls.join('\n');
        } else {
            // 开发模式mock
            const port = document.getElementById('portInput').value;
            document.getElementById('accessUrls').textContent =
                `https://192.168.1.100:${port}\nhttps://10.0.0.100:${port}`;
        }
    } catch (error) {
        console.error('获取访问地址失败', error);
    }
}

// 更新文件列表
function updateFileList() {
    const fileList = document.getElementById('fileList');
    const fileCount = document.getElementById('fileCount');
    const totalSize = document.getElementById('totalSize');

    if (state.files.length === 0) {
        fileList.innerHTML = `
            <div class="empty-state">
                <p>暂无共享文件</p>
                <p class="hint">点击"添加文件"或"添加文件夹"开始共享</p>
            </div>
        `;
        fileCount.textContent = '0';
        totalSize.textContent = '0 B';
        return;
    }

    fileList.innerHTML = state.files.map(file => `
        <div class="file-item">
            <div class="file-info">
                <div class="file-name">${file.name}</div>
                <div class="file-meta">
                    ${formatSize(file.size)} • ${file.type === 'directory' ? '文件夹' : '文件'}
                </div>
            </div>
            <div class="file-actions">
                <button class="btn btn-small btn-danger" onclick="removeFile('${file.id}')">删除</button>
            </div>
        </div>
    `).join('');

    fileCount.textContent = state.files.length;
    const total = state.files.reduce((sum, f) => sum + f.size, 0);
    totalSize.textContent = formatSize(total);
}

// 添加日志
function addLog(message, type = 'info') {
    const logList = document.getElementById('logList');
    const time = new Date().toLocaleTimeString();
    const typeClass = type === 'success' ? 'log-success' : type === 'error' ? 'log-error' : '';

    const entry = document.createElement('div');
    entry.className = 'log-entry';
    entry.innerHTML = `
        <span class="log-time">${time}</span>
        <span class="${typeClass}">${message}</span>
    `;

    if (logList.querySelector('.hint')) {
        logList.innerHTML = '';
    }

    logList.insertBefore(entry, logList.firstChild);

    // 限制日志数量
    while (logList.children.length > 100) {
        logList.removeChild(logList.lastChild);
    }
}

// 格式化文件大小
function formatSize(bytes) {
    if (bytes === 0) return '0 B';
    const k = 1024;
    const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
    const i = Math.floor(Math.log(bytes) / Math.log(k));
    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

// 显示过滤规则弹窗
function showFilterRules() {
    document.getElementById('filterModal').style.display = 'flex';
}

// 关闭过滤规则弹窗
function closeFilterModal(event) {
    // 如果没有传递event或者点击的是背景,则关闭
    if (!event || event.target.id === 'filterModal') {
        document.getElementById('filterModal').style.display = 'none';
    }
}

// 从Go后端接收事件(Wails事件监听)
if (window.runtime) {
    window.runtime.EventsOn('file_added', (file) => {
        state.files.push(file);
        updateFileList();
        addLog(`已添加: ${file.name}`, 'success');
    });

    window.runtime.EventsOn('transfer_log', (log) => {
        addLog(`${log.client_ip} 下载了 ${log.file_name}`, 'success');
    });
}
